package ThreadCurr;

/**
 * 测试多线程并发安全问题
 * 当多个线程并发操作同一临界资源，由于线程切换实际不确定，导致操作顺序出现混乱而从引发不良后果。
 * 临界资源:操作该资源的完整过程同一时间只能被单个线程进行
 */

public class Bank {
    private int account=20000;// 余额
    // 获取余额的方法
    public int getAccount() {
        return account;
    }
    public void saveAccount(int account){
        this.account = account;
    }

    /*
       当一个方法使用synchronized后，该方法称为"同步方法"
       多个线程不能同时在方法内部执行
       我们将多个线程并发操作改为同步(有先后顺序)执行方法时，可以有效的解决并发安全问题
    */
    public synchronized boolean getMoney(int money){
        int account =   getAccount();// 获取余额
        if(money<=account){// 代表有余额
            account = account-money;
            System.out.println(Thread.currentThread().getName()+"来取钱了");
            Thread.yield();//制造现场 要求主动放弃本次剩余时间片(模拟CPU执行到这里时没有时间了)

            saveAccount(account);// 更新余额
            return  true;
        }
        return false;
    }
}
